home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / passwrd4.arc / PASSWRD4.ASM < prev    next >
Assembly Source File  |  1985-07-10  |  7KB  |  265 lines

  1. PAGE 60,132
  2. TITLE PASSWRD4.ASM - PASSWRD4.SYS DEVICE DRIVER
  3. ;------------------------------------------------------------
  4. ;PASSWRD4.ASM (CREATES PASSWRD4.SYS, DEVICE DRIVER)
  5. ;DOS 2.00 DEVICE DRIVER FORCES USER TO ENTER PASSWORD ON BOOTING UP
  6. ;AND DISABLES Ctrl-Break.
  7. ;
  8. ; REV by JOHN R. PETROCELLI   02/25/85
  9. ; REV by JOHN R. PETROCELLI   04/30/85
  10. ;
  11. ; ADDITIONAL CODE HAS BEEN ADDED TO INITIALIZE INT 66h WITH THE
  12. ; SEGMENT AND OFFSET OF THE "RECALL" CODE (ASK_OFF). USING THE
  13. ; PROGRAM "LOCK.COM" WILL ENABLE THE USER TO DISBLE THE USE OF THE
  14. ; PC UNTIL THE CORRECT PASSWORD IS SUPPLIED.
  15. ;
  16. ;AFTER ASSEMBLY: LINK PASSWRD4 (ignore "no STACK" error)
  17. ;                EXE2BIN PASSWRD4 PASSWRD4.SYS
  18. ;                PLACE DEVICE=PASSWRD4.SYS IN CONFIG.SYS FILE
  19. ;                REBOOT SYSTEM WITH Ctrl-Alt-Del
  20. ;                ANSWER PROMPT WITH: Password <ENTER>
  21. ;                **** BEWARE OF UPPER VS LOWER CASE ****
  22. ;
  23.  
  24. DEV_SEG SEGMENT
  25. PWORD_DEVICE PROC FAR
  26.         ASSUME CS:DEV_SEG, DS:DEV_SEG, ES:DEV_SEG
  27.  
  28. ;---------------------------------------------------------------
  29. ;The following lines are the device header, which must exist for
  30. ;every device. This file has only one device, and it works with
  31. ;character I/O. It doesn't actually handle any I/O services,
  32. ;but it's easier to create a character device.
  33.  
  34. PWORD_DEV_HEADER:    ;label for the start of the device driver
  35.  
  36. NEXT_DEV_PTR    DD  -1     ;only 1 device is defined in this file
  37. DEV_ATTRIBUTE   DW  1000000000000000B
  38. STRATEGY_PTR    DW  STRATEGY   ;the installation procedure
  39. INTERUPT_PTR    DW  INTERUPT   ;the proc that handles all services
  40. DEVICE_NAME     DB  'PWORD'    ;8-byte string of device name
  41.  
  42. ; -- This is the storage area for the password --
  43. ; -- The first byte is the length (0-16) --------
  44. ; -- The following characters are the password --
  45. ; -- Only an exact match will allow the system --
  46. ; -- to continue the boot process ---------------
  47.  
  48. PASSWORD_STORE DB 4,'plan'
  49.                DB $-PASSWORD_STORE DUP(' ')  ;leave room for a
  50.                                              ;16-character password
  51.  
  52. IN_BUF_MAX DB 16
  53. IN_BUF_LEN DB ?
  54. IN_BUF     DB 16 DUP(?)
  55.  
  56. BREAK_SEG  DW ?
  57. BREAK_OFF  DW ?
  58.  
  59. ; -- The STRATEGY proc stores ES:BX request header pointer here
  60. ; -- The INTERUPT proc retrieves it
  61.  
  62. REQUEST_PTR LABEL DWORD
  63. REQ_PTR_OFF DW ?
  64. REQ_PTR_SEG DW ?
  65.  
  66. DUMMY_IRET  DB  207     ;Ctrl-Break vector is pointed here, so it
  67.                         ;does nothing. Break is not recognized!
  68.  
  69. ;---------------------- Messages ----------------------------------
  70. ;These messages are expected to be output via the ANSI.SYS device,
  71. ;so it should be installed (named in the CONFIG.SYS file) before
  72. ;this PWORD device.
  73. ;If you don't want to use ANSI.SYS, remove the ESC sequences in the
  74. ;messages.
  75.  
  76. LF EQU 0AH
  77. CR EQU 0DH
  78. ESC EQU 1BH
  79.  
  80. MSG_1 DB CR,LF,ESC,'[0m'      ;make output visible
  81.       DB 'Enter '
  82.       DB ESC,'[5m'            ;make output blink
  83.       DB 'Password: '
  84.       DB ESC,'[8m$'           ;make input invisible
  85.  
  86. MSG_2 DB CR,LF,ESC,'[0m'      ;make output visible
  87.       DB 'Password accepted.',CR,LF,'$'
  88.  
  89. ;====================================================================
  90. ;STRATEGY procedure
  91. ;Just saves the request header pointer for the INTERUPT proc
  92.  
  93. STRATEGY PROC FAR
  94.          ASSUME CS:DEV_SEG
  95.          MOV    CS:REQ_PTR_OFF,BX
  96.          MOV    CS:REQ_PTR_SEG,ES
  97.          RET
  98. STRATEGY ENDP
  99.  
  100. ;====================================================================
  101.  
  102. NO_BREAK PROC NEAR
  103.  
  104. ;The following 8 lines eliminate Ctrl-Break from having any effect
  105. ;on the system, unless another program KEYBOARD_BREAK vector is
  106. ;altered (BASIC does that).
  107. ; OLD BREAK VECTOR IS STORED SO THAT IT MAY BE RESET
  108.  
  109.          MOV    AX,0
  110.          MOV    ES,AX
  111.          MOV    AX,WORD PTR ES:[1Bh*4]
  112.          MOV    BREAK_SEG,AX
  113.          MOV    AX,WORD PTR ES:[1Bh*4+2]
  114.          MOV    BREAK_OFF,AX
  115.          MOV    WORD PTR ES:[1Bh*4],OFFSET DUMMY_IRET
  116.          MOV    WORD PTR ES:[1Bh*4+2],CS
  117.          RET
  118.  
  119. NO_BREAK ENDP
  120.  
  121. BREAK_ON  PROC NEAR
  122.  
  123. ; THE FOLLOWING 6 LINES RESTORE THE CTL-BREAK VECTOR
  124.  
  125.          MOV    AX,0
  126.          MOV    ES,AX
  127.          MOV    AX,BREAK_SEG
  128.          MOV    WORD PTR ES:[1Bh*4],AX
  129.          MOV    AX,BREAK_OFF
  130.          MOV    WORD PTR ES:[1Bh*4+2],AX
  131.          RET
  132.  
  133. BREAK_ON  ENDP
  134.  
  135. ;====================================================================
  136. ASK_PWRD  PROC NEAR
  137. ;
  138. ; This code prompts the user for the correct password
  139. ;
  140.  
  141.          JMP    SHORT NO_BEEP
  142. TRY_AGAIN:
  143.          MOV    AL,7
  144.          MOV    AH,0EH
  145.          INT    10H
  146. NO_BEEP:
  147.          MOV    DX,OFFSET MSG_1    ;"Enter Password: "
  148.          MOV    AH,9
  149.          INT    21H
  150.  
  151.          MOV    DX,OFFSET IN_BUF_MAX
  152.          MOV    AH,0CH
  153.          MOV    AL,0AH
  154.          INT    21H
  155.          MOV    AX,CS
  156.          MOV    ES,AX
  157.  
  158.          MOV    SI,OFFSET IN_BUF_LEN
  159.          MOV    DI,OFFSET PASSWORD_STORE
  160.          MOV    CH,0
  161.          MOV    CL,[SI]
  162.          CMP    CL,[DI]
  163.          JNE    TRY_AGAIN
  164.          INC    DI
  165.          INC    SI
  166.          REP    CMPSB
  167.          JNE    TRY_AGAIN
  168.  
  169.          MOV    DX,OFFSET MSG_2    ;"Password acceped"
  170.          MOV    AH,9
  171.          INT    21H
  172.  
  173.          RET
  174.  
  175. ASK_PWRD  ENDP
  176.  
  177. ;=====================================================================
  178. ;INTERUPT procedure
  179. ;Processes the command indicated in the request header.
  180.  
  181. INTERUPT PROC FAR
  182.          ASSUME CS:DEV_SEG, DS:NOTHING, ES:NOTHING
  183.          PUSH   DS
  184.          PUSH   ES
  185.          PUSH   AX
  186.          PUSH   BX
  187.          PUSH   CX
  188.          PUSH   DX
  189.          PUSH   DI
  190.          PUSH   SI
  191.          MOV    AX,CS
  192.          MOV    DS,AX
  193.  
  194.          LES    BX,REQUEST_PTR
  195.          MOV    AL,ES:[BX+2]
  196.          CMP    AL,0
  197.          JNE    ERROR_EXIT
  198.          JMP    INIT_FN
  199. ERROR_EXIT:
  200.          OR     WORD PTR ES:[BX+3],8003H
  201.          JMP    EXIT
  202. COMMON_EXIT:
  203.          OR     WORD PTR ES:[BX+3],100H
  204.  
  205. ; THE FOLLOWING 6 LINES SET THE REFERENCE FOR RECALL.
  206. ; LOCATION AT INT 66H IS USED FOR ADDRESS STORE
  207.  
  208.          MOV    AX,0
  209.          MOV    ES,AX
  210.          MOV    AX,CS
  211.          MOV    DS,AX
  212.          MOV    AX,OFFSET ASK_OFF
  213.          MOV    WORD PTR ES:[66H*4],AX
  214.          MOV    AX,CS
  215.          MOV    WORD PTR ES:[66H*4+2],AX
  216. EXIT:
  217.          POP    SI
  218.          POP    DI
  219.          POP    DX
  220.          POP    CX
  221.          POP    BX
  222.          POP    AX
  223.          POP    ES
  224.          POP    DS
  225.          RET
  226. ASK_OFF:
  227.          PUSH   DS
  228.          PUSH   ES
  229.          PUSH   AX
  230.          PUSH   BX
  231.          PUSH   CX
  232.          PUSH   DX
  233.          PUSH   DI
  234.          PUSH   SI
  235.          MOV    AX,CS
  236.          MOV    DS,AX
  237.  
  238.          CALL   ASK_PWRD
  239.  
  240.          JMP    EXIT
  241.  
  242. INIT_FN PROC NEAR
  243.          PUSH   ES
  244.  
  245.          CLI
  246.          CALL   NO_BREAK
  247.          STI
  248.  
  249.          CALL   ASK_PWRD
  250.  
  251.          CLI
  252.          CALL   BREAK_ON
  253.          STI
  254.  
  255.          POP    ES
  256.          MOV    WORD PTR ES:[BX+0EH],OFFSET INIT_FN
  257.          MOV    WORD PTR ES:[BX+10H],CS
  258.  
  259.          JMP    COMMON_EXIT
  260. INIT_FN  ENDP
  261. INTERUPT ENDP
  262. PWORD_DEVICE    ENDP
  263. DEV_SEG  ENDS
  264.          END PWORD_DEV_HEADER
  265.